home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 4 / MacMania 4.toast / / Demo's / Igor Demo Pro / 3 PutContentsIn Igor Pro Folder / Technical Notes / Igor Tech Notes / TN020-A Custom Peak Meas / TN020-A Voigt TEXT < prev   
Text File  |  1991-10-17  |  3KB  |  131 lines

  1.  
  2. Macro PreVoigt()
  3.     Silent 1        | calculating data to be used by the voigt function
  4.     Variable i,j
  5.     Variable H= .201
  6.     Variable CO
  7.     if( exists("W_RI") != 1 )
  8.         Make/N=22 W_b; W_b[1]= 0.7093602E-7
  9.         Make/N= 15 W_RI
  10.         Make W_XN={10,9,8,8,7,6,5,4,3,3,3,3,3,3,3}
  11.         Make W_YN={.6,.6,.6,.5,.4,.4,.3,.3,.3,.3,1,.9,.8,.7,.7}
  12.         Make/N=25 W_D0,W_D1,W_D2,W_D3,W_D4,W_HN
  13.         Make/N=19 W_NBY2=(19-P)/2
  14.         Make W_C={.7093602e-7,-.2518434e-6,.8566874e-6,-.2787638e-5,.866074e-5,-.2565551e-4,0}
  15.         W_C[6]={.7228775e-4,-.1933631e-3,.4899520e-3,-.1173267e-2,.2648762e-2,-.5623190e-2,0}
  16.         W_C[12]={.1119601e-1,-.2084976e-1,.3621573e-1,-.5851412e-1,.8770816e-1,-.121664,.15584,-.184,.2}
  17.         
  18.         i=0
  19.         do
  20.             W_RI[i]= -(i+1)/2
  21.             i+=1
  22.         while(i<15)
  23.         i=0
  24.         do
  25.             W_HN[i]= H*(i+0.5)
  26.             CO= 4*W_HN[i]*W_HN[i]/25 - 2
  27.             j=1
  28.             do
  29.                 W_b[j+1]= CO*W_b[j]-W_b[j-1]+W_C[j]
  30.                 j+=1
  31.             while(j<21)
  32.             W_D0[i]= W_HN[i]*(W_b[21]-W_b[20])/5
  33.             W_D1[i]= 1-2*W_HN[i]*W_D0[i]
  34.             W_D2[i]= (W_HN[i]*W_D1[i]+W_D0[i])/W_RI[1]
  35.             W_D3[i]= (W_HN[i]*W_D2[i]+W_D1[i])/W_RI[2]
  36.             W_D4[i]= (W_HN[i]*W_D3[i]+W_D2[i])/W_RI[3]
  37.             i+=1
  38.         while(i<25)
  39.         KillWaves W_C,W_b
  40.     endif
  41.     Print "You may now delete this macro"
  42. End
  43.  
  44. Function voigt(x,y)
  45.     Variable x,y
  46.  
  47.     Variable i,j
  48.     Variable H= .201
  49.     Variable Y2,U,V,UU,VV,region,maxv,N,DX,minv
  50.     Y2= Y*Y
  51.     x= abs(x)
  52.     if( (x-5) >= 0 )
  53.         if( Y >= (11-.6875*X) )
  54.             region= 4;
  55.         else
  56.             region= 5
  57.         endif
  58.     else
  59.         if( (y-1) > 0 )
  60.             if( x > 1.85*(3.6-Y) )
  61.                 if( Y >= (11-.6875*X) )
  62.                     region= 4;
  63.                 else
  64.                     region= 5
  65.                 endif
  66.             else
  67.                 region= 2
  68.             endif
  69.         else
  70.             if( x+y >= 5 )
  71.                 region= 5
  72.             else
  73.                 region= 1
  74.             endif
  75.         endif
  76.     endif
  77.     if( region==1 )         | region I
  78.         N=  trunc(X/H)            | Fortran truncates
  79.         DX= X-W_HN[n]
  80.         U= (((W_D4[N]*Dx+W_D3[N])*Dx+W_D2[N])*DX+W_D1[N])*DX+W_D0[N]
  81.         V= 1-2*X*U
  82.         | Talyor series expansion about Y=0
  83.         VV= exp(y2-X*X)*cos(2*X*Y)/1.128379 - Y*V
  84.         UU= -Y
  85.         maxv= trunc(5+(12.5-X)*0.8*Y)
  86.         i= 1
  87.         do
  88.             U= (X*V+U)/W_RI[i]
  89.             V= (X*U+V)/W_RI[i+1]
  90.             UU= -UU*Y2
  91.             VV= VV+V*UU
  92.             i+=2
  93.         while(i<maxv)
  94.         return 1.12837*VV
  95.     endif
  96.     if( region==2 )         | region II
  97.         if( Y < 1.45 )
  98.             I= trunc(11*Y)
  99.         else
  100.             I= trunc(2*Y)
  101.         endif
  102.         j= trunc(x+x+1.85)
  103.         maxv=W_XN[j-1]*W_YN[i-1]+.46
  104.         minv= trunc(min(16,21-2*maxv))
  105.         | evaluate continued fraction
  106.         UU= Y
  107.         VV= X
  108.         j= minv-1
  109.         do
  110.             U= W_NBY2[j]/(UU*UU+VV*VV)
  111.             UU= Y+U*UU
  112.             VV= X-U*VV
  113.             j+=1
  114.         while(j<19)
  115.         return UU/(UU*UU+VV*VV)/1.772454
  116.     endif
  117.     
  118.     if( region==4 )         | region IIIb
  119.         U= X-.7071068
  120.         V= X+.7071068
  121.         return Y*(.2820948/(Y2+U*U)+.2820948/(Y2+V*V))
  122.     endif
  123.     if( region==5 )            | region iiia
  124.         U= X-.5246476
  125.         V= X+.5246476
  126.         UU= X-1.65068
  127.         VV= X+1.65068
  128.         return Y*(.2562121/(Y2+U*U)+.2562121/(Y2+V*V)+.02588268/(Y2+UU*UU)+.02588268/(Y2+VV*VV))
  129.     endif
  130. end
  131.